import axios, { AxiosInstance } from "axios";
import { ElMessage } from "element-plus";
const BASE_URL: string = import.meta.env.VITE_BASE_URL || "";
const TIME_OUT: string = import.meta.env.VITE_TIME_OUT || "10000";

// 请求参数接口
interface RequestOptions {
  url: string;
  params?: { [key: string]: any };
  data?: { [key: string]: any };
  others?: Object;
}

// Http 请求类 接口
interface HttpOptions {
  BASE_URL?: string | undefined;
  TIME_OUT?: string | undefined;
}

class Http {
  BASE_URL: string = "";
  TIME_OUT: string = "";
  request: AxiosInstance = axios;
  constructor({ BASE_URL = "", TIME_OUT = "10000" }: HttpOptions) {
    this.BASE_URL = BASE_URL;
    this.TIME_OUT = TIME_OUT;
    this.init();
  }

  init() {
    this.request = axios.create({
      baseURL: this.BASE_URL,
      timeout: Number.parseInt(this.TIME_OUT),
    });
    // 添加请求拦截器
    this.request.interceptors.request.use(
      (config) => {
        // 在发送请求之前做些什么
        const token = localStorage.getItem("token");
        if (token) {
          config.headers.Authorization = `Bearer ${token}`; // 设置token 也有可能是自定义的请求头
        }
        return config;
      },
      (error) => {
        // 对请求错误做些什么
        return Promise.reject(error);
      }
    );

    // 添加响应拦截器
    this.request.interceptors.response.use(
      (response) => {
        // 对响应数据做点什么
        return response.data;
      },
      (error) => {
        ElMessage.error(error);
        // 对响应错误做点什么
        return Promise.reject(error);
      }
    );
  }

  /**
   * get 请求
   * @param {object} options - 请求参数对象
   * @param {string} options.url - 地址
   * @param {object} options.params - 参数
   * @param {object} [options.others] - 其他参数
   * @returns {Promise} - Promise对象
   */
  get({ url, params, others }: RequestOptions): Promise<any> {
    return this.request({
      method: "get",
      url,
      params,
      ...others,
    });
  }

  /**
   * post 请求
   * @param {object} options - 请求参数对象
   * @param {string} options.url - 地址
   * @param {object} options.data - 参数
   * @param {object} [options.others] - 其他参数
   * @returns {Promise} - Promise对象
   */
  post({ url, data, others }: RequestOptions): Promise<any> {
    return this.request({
      method: "post",
      url,
      data,
      ...others,
    });
  }

  /**
   * put 请求
   * @param {object} options - 请求参数对象
   * @param {string} options.url - 地址
   * @param {object} options.data - 参数
   * @param {object} [options.others] - 其他参数
   * @returns {Promise} - Promise对象
   */
  put({ url, data, others }: RequestOptions): Promise<any> {
    return this.request({
      method: "put",
      url,
      data,
      ...others,
    });
  }

  /**
   * delete 请求
   * @param {object} options - 请求参数对象
   * @param {string} options.url - 地址
   * @param {object} options.data - 参数
   * @param {object} [options.others] - 其他参数
   * @returns {Promise} - Promise对象
   */
  delete({ url, data, others }: RequestOptions): Promise<any> {
    return this.request({
      method: "delete",
      url,
      data,
      ...others,
    });
  }
}

// 默认导出实例如果有多个不同的请求可以导出为多个不同的实例
export default new Http({
  BASE_URL: BASE_URL,
  TIME_OUT: TIME_OUT,
});
